package com.example.dbsample.model.dto;

import lombok.Data;
import lombok.Setter;
import org.apache.ibatis.session.RowBounds;

import java.util.ArrayList;
import java.util.List;

@Data
public class Page<T> extends RowBounds {

    /**
     * 页编码：第几页
     */
    protected int pageNo = 1;

    /**
     *
     * 页大小
     */
    protected int pageSize = 10;

    /**
     * 偏移量：第一条数据在表中的位置
     */
    protected int offset = 0;

    /**
     * 限定数：每页的数量
     */
    protected int limit = 10;

    /**
     * 查询结果
     * -- SETTER --
     *  设置页内的记录列表

     */
    @Setter
    protected List<T> rows = new ArrayList<>();

    /**
     * 总条数
     */
    protected int total;

    /**
     * 总页数
     */
    protected int totalPages;

    /**
     * 计算偏移量
     */
    private void calcOffset() {
        this.offset = (pageNo - 1) * pageSize;
    }

    /**
     * 计算限定数
     */
    private void calcLimit() {
        this.limit = pageSize;
    }

    public Page() {
        this.calcOffset();
        this.calcLimit();
    }

    public Page(int pageNo, int pageSize) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.calcOffset();
        this.calcLimit();
    }

    public Page(Query query) {
        this.pageNo = query.getAsInt("pageNumber");
        this.pageSize = query.getAsInt("pageSize");
        this.calcOffset();
        this.calcLimit();
    }

    /**
     * 计算当前页第一条记录在总结果集中的位置，序号从1开始
      */
    public int getFirst() {
        return ((pageNo - 1) * pageSize) + 1;
    }

    /**
     * 记录总记录数
     */
    public void setTotal(final int total) {
        this.total = total;
        this.totalPages = this.getTotalPages();
    }

    /**
     * 根据pageSize与total计算总页数，默认值为-1
     */
    public int getTotalPages() {
        if(total < 0) {
            return -1;
        }
        int pages = total / pageSize;
        return total % pageSize > 0 ? ++pages : pages;
    }


}
